/******************************************************************************* * Copyright 2011 Antti Havanko * * This file is part of Motiver.fi. * Motiver.fi is licensed under one open source license and one commercial license. * * Commercial license: This is the appropriate option if you want to use Motiver.fi in * commercial purposes. Contact license@motiver.fi for licensing options. * * Open source license: This is the appropriate option if you are creating an open source * application with a license compatible with the GNU GPL license v3. Although the GPLv3 has * many terms, the most important is that you must provide the source code of your application * to your users so they can be free to modify your application for their own needs. ******************************************************************************/ package com.delect.motiver.client.presenter.profile; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.google.gwt.event.shared.SimpleEventBus; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.user.client.Timer; import com.delect.motiver.client.AppController; import com.delect.motiver.client.Motiver; import com.delect.motiver.client.MyAsyncCallback; import com.delect.motiver.client.ServerConnection; import com.delect.motiver.client.ServerConnection.ResponseHandler; import com.delect.motiver.client.event.ConnectionErrorEvent; import com.delect.motiver.client.presenter.Presenter; import com.delect.motiver.client.service.MyServiceAsync; import com.delect.motiver.client.view.Display; import com.delect.motiver.shared.CardioModel; import com.delect.motiver.shared.CardioValueModel; import com.delect.motiver.shared.Constants; import com.delect.motiver.shared.ExerciseModel; import com.delect.motiver.shared.ExerciseNameModel; import com.delect.motiver.shared.FoodModel; import com.delect.motiver.shared.FoodNameModel; import com.delect.motiver.shared.GuideValueModel; import com.delect.motiver.shared.MealModel; import com.delect.motiver.shared.MeasurementModel; import com.delect.motiver.shared.MeasurementValueModel; import com.delect.motiver.shared.RoutineModel; import com.delect.motiver.shared.RunModel; import com.delect.motiver.shared.RunValueModel; import com.delect.motiver.shared.TimeModel; import com.delect.motiver.shared.WorkoutModel; import com.delect.motiver.shared.util.CommonUtils; /** * Interface for fetching old data from xlGain.com * @author Antti * */ public class OldDataFetchPresenter extends Presenter { /** * Abstract class for view to extend */ public abstract static class OldDataFetchDisplay extends Display { public abstract void hideProgress(); public abstract void setHandler(OldDataFetchHandler oldDataFetchHandler); public abstract void showCompleted(boolean successful, String msg); public abstract void showProgress(String string, int c, int i); } public interface OldDataFetchHandler { void go(String user, String pass, Boolean showTraining, Boolean showCardio, Boolean showNutrition, Boolean showMeasurements); } private OldDataFetchDisplay display; private List<ExerciseNameModel> exercises; private Boolean fetchCardio = false; private Boolean fetchMeasurements = false; private Boolean fetchNutrition = false; private Boolean fetchTraining = false; private List<FoodNameModel> foods; private String msg =""; private String pass = ""; private String user = ""; protected int measFetchCount; int c = 0; final int limit = 50; public OldDataFetchPresenter(MyServiceAsync rpcService, SimpleEventBus eventBus, OldDataFetchDisplay display) { super(rpcService, eventBus); this.display = display; } @Override public Display getView() { return display; } @Override public void onBind() { display.setHandler(new OldDataFetchHandler() { @Override public void go(String userParam, String passParam, Boolean showTrainingParam, Boolean showCardioParam, Boolean showNutritionParam, Boolean showMeasurementsParam) { user = userParam; pass = passParam; fetchTraining = showTrainingParam; fetchCardio = showCardioParam; fetchNutrition = showNutritionParam; fetchMeasurements = showMeasurementsParam; startFetch(); } }); } /** * Fetchs cardio * @param index */ private void fetchCardio(int index) { //if cardios are not fetched jump directly to measurements if(!fetchCardio) { fetchMeasurements(0); return; } if(index == 0) { display.showProgress("Fetching cardio", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=6&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @SuppressWarnings("deprecation") @Override public void loadOk(JSONObject json) { JSONArray measurements; try { measurements = json.get("cardio").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); List<CardioModel> arrCardios = new ArrayList<CardioModel>(); List<List<CardioValueModel>> arrValues = new ArrayList<List<CardioValueModel>>(); //values for each measurement for(int i=0; i < measurements.size(); i++) { try { JSONObject obj = measurements.get(i).isObject(); CardioModel cardio = new CardioModel(); cardio.setName(obj.get("n").isString().stringValue()); //values List<CardioValueModel> val = new ArrayList<CardioValueModel>(); JSONArray values = obj.get("v").isArray(); for(int j=0; j < values.size(); j++) { try { JSONObject objVal = values.get(j).isObject(); CardioValueModel ex = new CardioValueModel(); ex.setDate(new Date((long) (objVal.get("d").isNumber().doubleValue() * 1000))); String t1 = objVal.get("t").isString().stringValue(); if(t1.length() == 8) { t1 = t1.substring(0, 5); } final double time = CommonUtils.getTimeToSeconds(t1); ex.getDate().setHours((int) (time / 3600)); ex.getDate().setMinutes((int) ((time % 3600) / 60)); ex.setDuration((long) objVal.get("du").isNumber().doubleValue()); ex.setPulse((int) objVal.get("p").isNumber().doubleValue()); ex.setCalories((int) objVal.get("c").isNumber().doubleValue()); ex.setInfo(objVal.get("i").isString().stringValue()); val.add(ex); } catch (Exception e) { Motiver.showException(e); } } arrValues.add(val); arrCardios.add(cardio); } catch (Exception e) { Motiver.showException(e); } } display.showProgress("Fetching cardio", (indexNew != 0)? indexNew : total, total); //add to server rpcService.fetchSaveCardios(arrCardios, arrValues, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { fetchCardio(indexNew); } else { fetchRuns(0); } } }); } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs foods * @param index */ private void fetchFoods(int index) { //if nutrition are not fetched end fetch if(!fetchNutrition) { showCompleted(true); return; } if(index == 0) { display.showProgress("Fetching foods", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=3&m=1&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @Override public void loadOk(JSONObject json) { JSONArray foods; try { foods = json.get("foods").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); List<FoodNameModel> arrFoods = new ArrayList<FoodNameModel>(); for(int i=0; i < foods.size(); i++) { try { JSONObject obj = foods.get(i).isObject(); FoodNameModel food = new FoodNameModel(); food.setName(obj.get("n").isString().stringValue()); food.setEnergy(obj.get("e").isNumber().doubleValue()); food.setProtein(obj.get("p").isNumber().doubleValue()); food.setCarb(obj.get("c").isNumber().doubleValue()); food.setFet(obj.get("f").isNumber().doubleValue()); food.setPortion(obj.get("po").isNumber().doubleValue()); food.setLocale(AppController.User.getLocale()); arrFoods.add(food); } catch (Exception e) { Motiver.showException(e); } } display.showProgress("Fetching foods", (indexNew != 0)? indexNew : total, total); //add to server rpcService.fetchSaveFoodNames(arrFoods, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { fetchFoods(indexNew); } else { fetchMeals(0); } } }); } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs guide values * @param index */ private void fetchGuideValues(int index) { if(index == 0) { display.showProgress("Fetching guide values", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=8&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @Override public void loadOk(JSONObject json) { JSONArray guides; try { guides = json.get("guides").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); //each values List<GuideValueModel> listValues = new ArrayList<GuideValueModel>(); for(int i=0; i < guides.size(); i++) { JSONObject obj = guides.get(i).isObject(); final String name = obj.get("n").isString().stringValue(); final Date dateStart = new Date((long) obj.get("d1").isNumber().doubleValue() * 1000); final Date dateEnd = new Date((long) obj.get("d2").isNumber().doubleValue() * 1000); final JSONObject objTraining = obj.get("t").isObject(); final double eT = objTraining.get("e").isNumber().doubleValue(); final double pT = objTraining.get("p").isNumber().doubleValue(); final double cT = objTraining.get("c").isNumber().doubleValue(); final double fT = objTraining.get("f").isNumber().doubleValue(); final JSONObject objRest = obj.get("t").isObject(); final double eR = objRest.get("e").isNumber().doubleValue(); final double pR = objRest.get("p").isNumber().doubleValue(); final double cR = objRest.get("c").isNumber().doubleValue(); final double fR = objRest.get("f").isNumber().doubleValue(); final boolean isPercent = !obj.get("g").isBoolean().booleanValue(); GuideValueModel value = new GuideValueModel(0L, name); value.setDates(dateStart, dateEnd); value.setEnergy(true, eT); value.setProtein(true, pT); value.setCarb(true, cT); value.setFet(true, fT); value.setEnergy(false, eR); value.setProtein(false, pR); value.setCarb(false, cR); value.setFet(false, fR); value.setPercent(isPercent); listValues.add(value); } display.showProgress("Fetching guide values", (indexNew != 0)? indexNew : total, total); //add to server rpcService.fetchSaveGuideValues(listValues, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { fetchGuideValues(indexNew); } else { fetchTimes(0); } } }); } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs meals * @param index */ private void fetchMeals(int index) { if(index == 0) { display.showProgress("Fetching meals", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=5&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @Override public void loadOk(JSONObject json) { JSONArray meals; try { meals = json.get("meals").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); List<MealModel> arrMeals = new ArrayList<MealModel>(); for(int i=0; i < meals.size(); i++) { try { JSONObject obj = meals.get(i).isObject(); MealModel mMeal = new MealModel(); mMeal.setName(obj.get("n").isString().stringValue()); //foods List<FoodModel> foods = new ArrayList<FoodModel>(); JSONArray f = obj.get("f").isArray(); for(int j=0; j < f.size(); j++) { try { JSONObject objF = f.get(j).isObject(); FoodModel food = new FoodModel(); food.setAmount(objF.get("a").isNumber().doubleValue()); //get food name food.setName(getFoodName(objF.get("n").isString().stringValue(), objF.get("e").isNumber().doubleValue())); foods.add(food); } catch (Exception e) { Motiver.showException(e); } } mMeal.setFoods(foods); arrMeals.add(mMeal); } catch (Exception e) { Motiver.showException(e); } } display.showProgress("Fetching meals", (indexNew != 0)? indexNew : total, total); //add to server rpcService.fetchSaveMeals(arrMeals, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { fetchMeals(indexNew); } else { //fetch food names to reduce server load rpcService.searchFoodNames("", 500, new MyAsyncCallback<List<FoodNameModel>>() { @Override public void onSuccess(List<FoodNameModel> result) { foods = result; fetchGuideValues(0); } }); } } }); } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs measurements * @param index */ private void fetchMeasurements(int index) { //if measurements are not fetched jump directly to food if(!fetchMeasurements) { fetchFoods(0); return; } if(index == 0) { display.showProgress("Fetching measurements", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=2&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @Override public void loadOk(JSONObject json) { JSONArray measurements; try { measurements = json.get("measurements").isArray(); final int total = (int)json.get("total").isNumber().doubleValue(); List<MeasurementModel> arrMeasurements = new ArrayList<MeasurementModel>(); List<List<MeasurementValueModel>> arrValues = new ArrayList<List<MeasurementValueModel>>(); //values for each measurement for(int i=0; i < measurements.size(); i++) { try { JSONObject obj = measurements.get(i).isObject(); MeasurementModel measurement = new MeasurementModel(); measurement.setName(obj.get("t").isString().stringValue()); measurement.setUnit(obj.get("u").isString().stringValue()); //values List<MeasurementValueModel> val = new ArrayList<MeasurementValueModel>(); JSONArray values = obj.get("v").isArray(); for(int j=0; j < values.size(); j++) { try { JSONObject objVal = values.get(j).isObject(); MeasurementValueModel ex = new MeasurementValueModel(); ex.setDate(new Date((long) (objVal.get("d").isNumber().doubleValue() * 1000))); ex.setValue(objVal.get("v").isNumber().doubleValue()); val.add(ex); } catch (Exception e) { Motiver.showException(e); } } arrValues.add(val); arrMeasurements.add(measurement); } catch (Exception e) { Motiver.showException(e); } } display.showProgress("Fetching measurements", 0, total); sendMeasurements(0, 0, arrMeasurements, arrValues); } catch (Exception e) { Motiver.showException(e); measFetchCount = 100; showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs routines * @param index */ private void fetchRoutines(int index) { if(index == 0) { display.showProgress("Fetching routines", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=1&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @Override public void loadOk(JSONObject json) { try { JSONArray routines = json.get("routines").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); List<RoutineModel> arrRoutines = new ArrayList<RoutineModel>(); List<List<WorkoutModel>> arrWorkouts = new ArrayList<List<WorkoutModel>>(); //workouts for each routine for(int i=0; i < routines.size(); i++) { try { JSONObject obj = routines.get(i).isObject(); RoutineModel routine = new RoutineModel(); try { routine.setDate(new Date((long) (obj.get("s").isNumber().doubleValue() * 1000))); } catch (Exception e) { } routine.setDays((int) obj.get("d").isNumber().doubleValue()); routine.setName(obj.get("n").isString().stringValue()); routine.setInfo(obj.get("i").isString().stringValue()); //workouts JSONArray workouts = obj.get("w").isArray(); arrWorkouts.add(parseWorkouts(workouts)); arrRoutines.add(routine); } catch (Exception e) { Motiver.showException(e); } } display.showProgress("Fetching routines", (indexNew != 0)? indexNew : total, total); //add to server rpcService.fetchSaveRoutines(arrRoutines, arrWorkouts, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { fetchRoutines(indexNew); } else { fetchCardio(0); } } }); } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs run * @param index */ private void fetchRuns(int index) { if(index == 0) { display.showProgress("Fetching runs", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=7&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @SuppressWarnings("deprecation") @Override public void loadOk(JSONObject json) { JSONArray measurements; try { measurements = json.get("run").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); List<RunModel> arrRuns = new ArrayList<RunModel>(); List<List<RunValueModel>> arrValues = new ArrayList<List<RunValueModel>>(); //values for each measurement for(int i=0; i < measurements.size(); i++) { try { JSONObject obj = measurements.get(i).isObject(); RunModel run = new RunModel(); run.setName(obj.get("n").isString().stringValue()); run.setDistance(obj.get("d").isNumber().doubleValue()); run.setTargetTime((long) obj.get("t").isNumber().doubleValue()); //values List<RunValueModel> val = new ArrayList<RunValueModel>(); JSONArray values = obj.get("v").isArray(); for(int j=0; j < values.size(); j++) { try { JSONObject objVal = values.get(j).isObject(); RunValueModel ex = new RunValueModel(); ex.setDate(new Date((long) (objVal.get("d").isNumber().doubleValue() * 1000))); String t1 = objVal.get("t").isString().stringValue(); if(t1.length() == 8) { t1 = t1.substring(0, 5); } final double time = CommonUtils.getTimeToSeconds(t1); ex.getDate().setHours((int) (time / 3600)); ex.getDate().setMinutes((int) ((time % 3600) / 60)); ex.setDuration((long) objVal.get("du").isNumber().doubleValue()); ex.setPulse((int) objVal.get("p").isNumber().doubleValue()); ex.setCalories((int) objVal.get("c").isNumber().doubleValue()); ex.setInfo(objVal.get("i").isString().stringValue()); val.add(ex); } catch (Exception e) { Motiver.showException(e); } } arrValues.add(val); arrRuns.add(run); } catch (Exception e) { Motiver.showException(e); } } display.showProgress("Fetching runs", (indexNew != 0)? indexNew : total, total); //add to server rpcService.fetchSaveRuns(arrRuns, arrValues, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { fetchRuns(indexNew); } else { fetchMeasurements(0); } } }); } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs times * @param index */ private void fetchTimes(int index) { if(index == 0) { display.showProgress("Fetching nutrition", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=4&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @Override public void loadOk(JSONObject json) { JSONArray times; try { times = json.get("times").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); List<TimeModel> arrTimes = new ArrayList<TimeModel>(); for(int i=0; i < times.size(); i++) { try { JSONObject obj = times.get(i).isObject(); TimeModel mTime = new TimeModel(); mTime.setDate(new Date((long) (obj.get("d").isNumber().doubleValue() * 1000))); String t1 = obj.get("t").isString().stringValue(); if(t1.length() == 8) { t1 = t1.substring(0, 5); } mTime.setTime(CommonUtils.getTimeToSeconds(t1)); //foods List<FoodModel> foods = new ArrayList<FoodModel>(); JSONArray f = obj.get("f").isArray(); for(int j=0; j < f.size(); j++) { try { JSONObject objF = f.get(j).isObject(); FoodModel food = new FoodModel(); food.setAmount(objF.get("a").isNumber().doubleValue()); //get food name food.setName(getFoodName(objF.get("n").isString().stringValue(), objF.get("e").isNumber().doubleValue())); foods.add(food); } catch (Exception e) { Motiver.showException(e); } } mTime.setFoods(foods); List<MealModel> meals = new ArrayList<MealModel>(); JSONArray array = obj.get("m").isArray(); for(int j=0; j < array.size(); j++) { try { JSONObject objM = array.get(j).isObject(); MealModel meal = new MealModel(); meal.setName(objM.get("n").isString().stringValue()); //foods in this meal List<FoodModel> foodsInMeal = new ArrayList<FoodModel>(); JSONArray fMeal = objM.get("f").isArray(); for(int k=0; k < fMeal.size(); k++) { try { JSONObject objF = fMeal.get(k).isObject(); FoodModel food = new FoodModel(); food.setAmount(objF.get("a").isNumber().doubleValue()); //get food name food.setName(getFoodName(objF.get("n").isString().stringValue(), objF.get("e").isNumber().doubleValue())); foodsInMeal.add(food); } catch (Exception e) { Motiver.showException(e); } } meal.setFoods(foodsInMeal); meals.add(meal); } catch (Exception e) { Motiver.showException(e); } } mTime.setMeals(meals); arrTimes.add(mTime); } catch (Exception e) { Motiver.showException(e); } } display.showProgress("Fetching nutrition", (indexNew != 0)? indexNew : total, total); //add to server if(arrTimes.size() > 0) { rpcService.fetchSaveTimes(arrTimes, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { //small delay before new fetch Timer timer = new Timer() { @Override public void run() { fetchTimes(indexNew); } }; timer.schedule(Constants.FETCH_DELAY); } else { showCompleted(true); } } }); } else { if(indexNew != 0) { fetchTimes(indexNew); } else { showCompleted(true); } } } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Fetchs workotus * @param index */ private void fetchWorkouts(int index) { //if training are not fetched jump directly to cardio if(!fetchTraining) { fetchCardio(0); return; } if(index == 0) { display.showProgress("Fetching workouts", 0, 0); } //TEMP fetch data ServerConnection con = new ServerConnection(); //workouts try { con.connect("http://www.xlgain.com/feed_jsonp/get_all.php?t=0&i=" + index + "&user=" + user + "&pass=" + CommonUtils.md5(pass), new ResponseHandler() { @Override public void loadError(Throwable throwable) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); } @Override public void loadOk(JSONObject json) { JSONArray workouts; try { workouts = json.get("workouts").isArray(); final int indexNew = (int)json.get("index").isNumber().doubleValue(); final int total = (int)json.get("total").isNumber().doubleValue(); List<WorkoutModel> arrWorkouts = parseWorkouts(workouts); display.showProgress("Fetching workouts", (indexNew != 0)? indexNew : total, total); //add to server rpcService.fetchSaveWorkouts(arrWorkouts, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if(indexNew != 0) { fetchWorkouts(indexNew); } else { //fetch food names to reduce server load rpcService.searchExerciseNames("", 500, new MyAsyncCallback<List<ExerciseNameModel>>() { @Override public void onSuccess(List<ExerciseNameModel> result) { exercises = result; fetchRoutines(0); } }); } } }); } catch (Exception e) { Motiver.showException(e); showCompleted(false); } } }); } catch (Exception e) { ConnectionErrorEvent event = new ConnectionErrorEvent(Constants.ERROR_CANT_CONNECT_XLGAIN); eventBus.fireEvent(event); Motiver.showException(e); showCompleted(false); } } /** * Returns correct exercise name based on name & energy * @param name * @param target * @return */ protected ExerciseNameModel getExerciseName(String name, int target) { //set base model (used if nothing founds) ExerciseNameModel model = new ExerciseNameModel(0L, name, target); //set locale model.setLocale(AppController.User.getLocale()); if(exercises == null) { return model; } try { for(ExerciseNameModel m : exercises) { if(m.getName().equals(name) && m.getTarget() == target) { model = m; break; } } } catch (Exception e) { Motiver.showException(e); } return model; } /** * Returns correct food name based on name & energy * @param name * @param energy * @return */ protected FoodNameModel getFoodName(String name, double energy) { //set base model (used if nothing founds) FoodNameModel model = new FoodNameModel(0L, name); model.setEnergy(energy); //set locale model.setLocale(AppController.User.getLocale()); if(foods == null) { return model; } try { for(FoodNameModel m : foods) { if(m.getName().equals(name) && Double.compare(m.getEnergy(), energy) == 0) { model = m; break; } } } catch (Exception e) { Motiver.showException(e); } return model; } /** * Parses workouts json array * @param workouts * @return */ protected List<WorkoutModel> parseWorkouts(JSONArray workouts) { ArrayList<WorkoutModel> arrWorkouts = new ArrayList<WorkoutModel>(); for(int i=0; i < workouts.size(); i++) { try { JSONObject obj = workouts.get(i).isObject(); WorkoutModel workout = new WorkoutModel(); try { workout.setDate(new Date((long) (obj.get("d").isNumber().doubleValue() * 1000))); } catch (Exception e) { Motiver.showException(e); } workout.setDone(obj.get("done").isBoolean().booleanValue()); workout.setName(obj.get("n").isString().stringValue()); workout.setRating((int) obj.get("r").isNumber().doubleValue()); workout.setInfo(obj.get("i").isString().stringValue()); //day in routine try { workout.setDayInRoutine((int) obj.get("day").isNumber().doubleValue()); } catch (Exception e) { Motiver.showException(e); } //times try { String t1 = obj.get("t1").isString().stringValue(); if(t1.length() == 8) { t1 = t1.substring(0, 5); } workout.setTimeStart(CommonUtils.getTimeToSeconds(t1)); String t2 = obj.get("t2").isString().stringValue(); if(t2.length() == 8) { t2 = t2.substring(0, 5); } workout.setTimeEnd(CommonUtils.getTimeToSeconds(t2)); } catch (Exception e) { Motiver.showException(e); } //exercises List<ExerciseModel> arrExercises = new ArrayList<ExerciseModel>(); JSONArray exercises = obj.get("ex").isArray(); for(int j=0; j < exercises.size(); j++) { JSONObject objEx = exercises.get(j).isObject(); //get name ExerciseNameModel name = getExerciseName(objEx.get("n").isString().stringValue(), (int)(objEx.get("t").isNumber().doubleValue())); ExerciseModel ex = new ExerciseModel(); ex.setName(name); ex.setInfo(objEx.get("i").isString().stringValue()); ex.setReps(objEx.get("r").isString().stringValue()); ex.setSets((int)objEx.get("s").isNumber().doubleValue()); ex.setTempo(objEx.get("te").isString().stringValue()); ex.setOrder((int)objEx.get("o").isNumber().doubleValue()); ex.setWeights(objEx.get("w").isString().stringValue()); arrExercises.add(ex); } workout.setExercises(arrExercises); arrWorkouts.add(workout); } catch (Exception e) { Motiver.showException(e); } } return arrWorkouts; } protected void removeAll() { display.showProgress("Removing all data", c, 10); c++; //first remove all data rpcService.fetchRemoveAll(fetchTraining, fetchCardio, fetchNutrition, fetchMeasurements, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { //if all removed if(!result) { //fetch food names to reduce server load rpcService.searchExerciseNames("", 500, new MyAsyncCallback<List<ExerciseNameModel>>() { @Override public void onSuccess(List<ExerciseNameModel> result) { exercises = result; fetchWorkouts(0); } }); } //more entities left else { removeAll(); } } }); } protected void sendMeasurements(final int meas, final int val, final List<MeasurementModel> measurements, final List<List<MeasurementValueModel>> arrValues) { try { final List<MeasurementValueModel> listValues = arrValues.get(meas); //send 100 values at once List<MeasurementValueModel> list = new ArrayList<MeasurementValueModel>(); list.addAll(listValues.subList(val, (val + limit >= listValues.size())? listValues.size() : val + limit)); //add to server rpcService.fetchSaveMeasurements(measurements.get(meas), list, new MyAsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { //next measurement/value //if values left if(val + limit < listValues.size()) { sendMeasurements(meas, val + limit, measurements, arrValues); } //if measurements left else if(meas + 1 < measurements.size()) { sendMeasurements(meas + 1, 0, measurements, arrValues); } //next fetch else { fetchFoods(0); } } }); } catch (Exception e) { Motiver.showException(e); } } /** * Starts fetching data */ protected void startFetch() { removeAll(); } /** * Shows if data is fetched correctly or not * @param successful */ void showCompleted(boolean successful) { display.showCompleted(successful, msg ); } }